# -*- coding: Latin-1 -*-
#!/usr/bin/env python
'''
Created on 11/06/2012

@author: nmedina
'''
import Excepciones
import smtplib
import mimetypes
import email 
import email.mime.text 
import email.mime.base 
import email.mime.multipart 
import email.iterators 
import email.generator 
import email.utils 
try:     
    from email.MIMEText import MIMEText 
except:     
    from email.mime import text as MIMEText 
import Errores
import re
class Email(Errores.ManejoErrores):
    def __init__(self,cuenta
                 ,password
                 ,serverentrante = "localhost",puertoentrante = 110
                 ,serversaliente = "localhost",puertosaliente = 25):
        self.setCuenta(cuenta)
        self.setPass(password)
        self.setServerCorreoEntrante(serverentrante)
        self.setPuertoCorreoEntrante(puertoentrante)
        self.setServerCorreoSaliente(serversaliente)
        self.setPuertoCorreoSaliente(puertosaliente)
        self.__Destinatarios = []
        Errores.ManejoErrores.__init__(self, None)
        self.SetClase("Email")
        self.SetMetodo("__init__")
        self.AddSeguimientoCodigo()
    def getCuenta(self):
        return self.__Cuenta
    def getPass(self):
        return self.__Pass
    def getServerCorreoEntrante(self):
        return self.__ServerCorreoEntrante
    def getPuertoCorreoEntrante(self):
        return self.__PuertoCorreoEntrante
    def getServerCorreoSaliente(self):
        return self.__ServerCorreoSaliente
    def getPuertoCorreoSaliente(self):
        return self.__PuertoCorreoSaliente
    def setCuenta(self, value):
        if self.__ValidarCuenta(value)== True:
            self.__Cuenta = value
        else:
            raise Excepciones.Genericas.Generico_ErrorDeValidacion(
                            "Email"
                            , "SetCuenta"
                            , "Formato de cuenta incorrecto")
    def setPass(self, value):
        self.__Pass = value
    def setServerCorreoEntrante(self, value):
        self.__ServerCorreoEntrante = value
    def setPuertoCorreoEntrante(self, value):
        try:
            value = int(value)
            self.__PuertoCorreoEntrante = value
        except:
            raise Excepciones.Genericas.Generico_ErrorCastearValor(
                        "Email"
                        , "setPuertoCorreoEntrante"
                        , "PuertoCorreoEntrante"
                        , "Error al convertir a entero")
        
    def setServerCorreoSaliente(self, value):
        self.__ServerCorreoSaliente = value
    def setPuertoCorreoSaliente(self, value):
        try:
            value = int(value)
            self.__PuertoCorreoSaliente = value
        except:
            raise Excepciones.Genericas.Generico_ErrorCastearValor(
                        "Email"
                        , "setPuertoCorreoSaliente"
                        , "PuertoCorreoSaliente"
                        , "Error al convertir a entero")
    def VerificarServer(self):
        try:
            SmtpServer = smtplib.SMTP(self.getServerCorreoSaliente()
                                      , self.getPuertoCorreoSaliente())
            SmtpServer.ehlo()
            SmtpServer.starttls()
            SmtpServer.ehlo()
            SmtpServer.login(self.getCuenta(), self.getPass())
            SmtpServer.close()
            return True
        except smtplib.SMTPConnectError:
            error = sys.exc_info()[:2]
            raise Excepciones.Genericas.Email_Error(
                                            self.GetClase()
                                            , self.GetMetodo()
                                            , """Error de comunicacion con servidor.
 """ + str(error[1])  )
        except smtplib.SMTPAuthenticationError:
            error = sys.exc_info()[:2]
            raise Excepciones.Genericas.Email_Error(
                                              self.GetClase()
                                              , self.GetMetodo()
                                              , """Cuenta o pass incorrecta.
 """ + str(error[1])  )

    def AddDestinatario(self,cuenta):
        cuenta = cuenta.replace(" ","")
        if self.__ValidarCuenta(cuenta.strip())== True:
            self.__Destinatarios.append(cuenta)
        else:
            raise Excepciones.Genericas.Generico_ErrorDeValidacion(
                            "Email"
                            , "AddDestinatario"
                            , "Formato de cuenta incorrecto")
    def __ValidarCuenta(self,cuenta):
        if re.match('^[(a-z0-9\_\-\.)]+@[(a-z0-9\_\-\.)]+\.[(a-z)]{2,4}$',cuenta.lower()):
            return True
        else:
            return False
    def __PrepararMensaje(self,asunto ,remitente,destinatario,mensaje):
        mensaje = MIMEText(mensaje)
        mensaje['Subject'] = asunto
        mensaje['From'] = remitente
        mensaje['To'] = destinatario
        return mensaje.as_string()
    def Enviar(self,asunto,mensaje):
        try:
            SmtpServer = smtplib.SMTP(self.getServerCorreoSaliente()
                                      , self.getPuertoCorreoSaliente())
            SmtpServer.ehlo()
            SmtpServer.starttls()
            SmtpServer.ehlo()
            SmtpServer.login(self.getCuenta(), self.getPass())
            for destino in self.__Destinatarios:
                SmtpServer.sendmail(self.getCuenta()
                                    , destino
                                    , self.__PrepararMensaje(asunto
                                                             , self.getCuenta()
                                                             , destino
                                                             , mensaje)
                                    )
            SmtpServer.close()
            return True
        except smtplib.SMTPConnectError:
            SmtpServer.close()
            error = sys.exc_info()[:2]
            raise Excepciones.Genericas.Email_Error(
                                            self.GetClase()
                                            , self.GetMetodo()
                                            , """Error de comunicacion con el servidor.
 """ + str(error[1])  )